package cn.king.springframework.aop.framework;

import org.aopalliance.intercept.MethodInvocation;

import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Method;

/**
 * MethodInterceptor--方法拦截器，不是jdk中的
 * MethodInvocation--代理方法包装器,用来将被代理目标类，方法、方法参数包装在一起
 * InvocationHandler--jdk中自带的
 */
public class ReflectiveMethodInvocation implements MethodInvocation {

    /**
     * 目标对象
     */
    protected final  Object target;
    /**
     * 目标对象中的目标方法
     */
    protected final  Method method;
    /**
     * 目标方法中的参数列表
     */
    protected final Object[] args;

    public ReflectiveMethodInvocation(Object target, Method method, Object[] args) {
        this.target = target;
        this.method = method;
        this.args = args;
    }

    @Override
    public Method getMethod() {
        return method;
    }

    @Override
    public Object[] getArguments() {
        return args;
    }

    @Override
    public Object proceed() throws Throwable {
        return method.invoke(target,args);
    }

    @Override
    public Object getThis() {
        return target;
    }

    /**
     * AccessibleObject类是Field、Method和Constructor对象的基类。
     * 它提供了在使用反射对象时将其标记为抑制默认Java语言访问控制检查的能力。
     * 访问检查——针对公共成员、默认(包)访问、受保护成员和私有成员——分别在使用字段、方法或构造函数来设置或获取字段、
     * 调用方法或创建和初始化类的新实例时执行。
     * 在反射对象中设置可访问标志，允许具有足够特权的复杂应用程序(如Java对象序列化或其他持久性机制)以通常被禁止的方式操作对象。
     * 默认情况下，反射对象不可访问
     * @return
     */
    @Override
    public AccessibleObject getStaticPart() {

        return method;
    }
}
